home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / bbsutil / hsrc_117.zip / TWINDOW.C < prev    next >
Text File  |  1990-11-09  |  21KB  |  1,046 lines

  1. /* TWINDOW.C File */
  2.  
  3. #include <stdio.h>
  4. #include <ctype.h>
  5. #include <stdarg.h>
  6. #include <dos.h>
  7. #include <alloc.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <conio.h>
  11. #include "twindow.h"
  12. #include "keys.h"
  13.  
  14. #define TABS         4
  15. #define ON        1
  16. #define OFF        0
  17. #define ERROR        -1
  18.  
  19. /* Local prototypes */
  20.  
  21. void pascal redraw(WINDOW *wnd);
  22. void pascal dtitle(WINDOW *wnd);
  23. int * pascal waddr(WINDOW *wnd,int x,int y);
  24. void pascal vswap(WINDOW *wnd);
  25. void pascal vsave(WINDOW *wnd);
  26. void pascal vrstr(WINDOW *wnd);
  27. void pascal add_list(WINDOW *wnd);
  28. void pascal beg_list(WINDOW *wnd);
  29. void pascal remove_list(WINDOW *wnd);
  30. void pascal insert_list(WINDOW *w1,WINDOW *w2);
  31. #ifndef FASTWINDOWS
  32.  int pascal dget(WINDOW *wnd,int x,int y);
  33.  int pascal verify_wnd(WINDOW **w1);
  34. #endif
  35. #ifdef USECLOCK
  36.  extern void pascal print_clock(void);
  37. #endif
  38.  
  39. /* Array of border character sets */
  40.  
  41. struct {
  42.   int nw,ne,se,sw,side,line;
  43.   } wcs[]={
  44.     {254,24,217,25,179,196},     /* single line */
  45.     {254,24,188,25,186,205},     /* double line */
  46.     {254,24,189,25,186,196},     /* single top, double side */
  47.     {254,24,190,25,179,205},     /* double top, single side */
  48.     {194,26,217,27,179,196},     /* pop-down menu */
  49.     {201,187,188,200,186,205},    /* double line no cues*/
  50.     {254,183,189,211,186,196}   /* horizontal menu of pull-down */
  51.   };
  52.  
  53. /* Window structure linked list head & tail */
  54.  
  55. WINDOW *listhead = NULL;
  56. WINDOW *listtail = NULL;
  57.  
  58. WINDOW *ewnd=NULL;    /* Global error/note window */
  59.  
  60. int VSG;  /* video segment address */
  61.  
  62. /* Variables which should be set by external functions */
  63.  
  64. unsigned int vbase=0;              /* for pd direct screen funcs if used */
  65. unsigned int maxx=0;            /* # columns on screen */
  66. unsigned int maxy=0;            /* # rows on screen */
  67. unsigned char current_color=7;  /* for pd direct screen funcs if used */
  68. unsigned int videomethod=0;     /* for pd direct screen funcs if used */
  69. unsigned char usemouse=0;       /* mouse used if non-zero */
  70. int oldmousex=-1,oldmousey,oldmousevid;
  71. int wasconfinedx1=-1,wasconfinedy1,wasconfinedx2,wasconfinedy2;
  72.  
  73. /* Establish a new window */
  74.  
  75. WINDOW * pascal establish_window (x,y,h,w) {
  76.  
  77.   WINDOW *wnd;
  78.  
  79.   VSG=(vmode()==7 ? 0xb000: 0xb800);
  80.   if ((wnd=(WINDOW *) malloc(sizeof(WINDOW)))==NULL)
  81.     return NULL;
  82.  
  83.   /* Adjust for out-of-bounds parameters */
  84.  
  85.   WTITLE="";
  86.   HEIGHT=min(h,maxy);
  87.   WIDTH=min(w,maxx);
  88.   COL=max(0,min(x,maxx-WIDTH));
  89.   ROW=max(0,min(y,maxy-HEIGHT));
  90.   WCURS=0;
  91.   SCROLL=0;
  92.   SELECT=1;
  93.   BTYPE=0;
  94.   VISIBLE=HIDDEN=0;
  95.   PREV=NEXT=NULL;
  96.   FHEAD=FTAIL=NULL;
  97.   WBORDER=WNORMAL=PNORMAL=WTITLEC=clr(BLACK,WHITE,BRIGHT);
  98.   WACCENT=clr(WHITE,BLACK,DIM);
  99.     if ((SAV=malloc(WIDTH * HEIGHT * 2))==(char *)0) return NULL;
  100.     add_list(wnd);
  101.   #ifndef FASTWINDOWS
  102.     clear_window(wnd);
  103.     wframe(wnd);
  104.   #endif
  105.     return(wnd);
  106. }
  107.  
  108.  
  109. /* Set the window's border */
  110.  
  111. void pascal set_border (WINDOW *wnd,int btype) {
  112.  
  113.   if (verify_wnd(&wnd)) {
  114.     BTYPE=btype;
  115.     redraw(wnd);
  116.   }
  117. }
  118.  
  119. /* Set colors */
  120.  
  121. void pascal set_colors (WINDOW *wnd,int area,int bg,int fg,int inten) {
  122.  
  123.   if (vmode()==7) {
  124.     if (bg != WHITE && bg !=BLACK) return;
  125.     if (fg !=WHITE && fg!=BLACK) return;
  126.   }
  127.   if(fg==bg) return;
  128.   if (verify_wnd(&wnd)) {
  129.     if (area==ALL)
  130.       while (area)
  131.         WCOLOR[--area]=clr(bg,fg,inten);
  132.     else WCOLOR[area]=clr(bg,fg,inten);
  133.     redraw (wnd);
  134.   }
  135. }
  136.  
  137. /* Set intensity of window */
  138.  
  139. void pascal set_intensity (WINDOW *wnd,int inten) {
  140.  
  141.   int area=ALL;
  142.  
  143.   if (verify_wnd(&wnd)) {
  144.     while (area) {
  145.       WCOLOR[--area]&= ~BRIGHT;
  146.       WCOLOR[area] |= inten;
  147.     }
  148.     redraw(wnd);
  149.   }
  150. }
  151.  
  152. /* Set title */
  153.  
  154. void pascal set_title (WINDOW *wnd,char *title) {
  155.   if (verify_wnd(&wnd)) {
  156.     WTITLE=title;
  157.     redraw(wnd);
  158.   }
  159. }
  160.  
  161. /* Redraw a window when an attribute changes */
  162.  
  163. static void pascal redraw (WINDOW *wnd) {
  164.  
  165. #ifndef FASTWINDOWS
  166.   int x,y,chat,atr;
  167.  
  168.   for (y=1;y<HEIGHT-1;y++)
  169.     for (x=1;x<WIDTH-1;x++) {
  170.       chat=dget(wnd,x,y);
  171.       atr=(((chat>>8)&255) ==
  172.     PNORMAL ? WNORMAL : WACCENT);
  173.       displ(wnd,x,y,chat&255,atr);
  174.     }
  175.   wframe(wnd);
  176. #endif
  177.   PNORMAL=WNORMAL;
  178. }
  179.  
  180. /* Display an established window */
  181.  
  182. void pascal display_window (WINDOW *wnd) {
  183.  
  184.   if (verify_wnd(&wnd)&& !VISIBLE) {
  185.     VISIBLE=1;
  186. #ifdef FASTWINDOWS
  187.     if (HIDDEN) {
  188.       HIDDEN=0;
  189.       vrstr(wnd);
  190.       wframe(wnd);
  191.     }
  192.     else {
  193.       vsave (wnd);
  194.       clear_window(wnd);
  195.       wframe(wnd);
  196.     }
  197. #else
  198.     vswap(wnd);
  199. #endif
  200.   }
  201. }
  202.  
  203. /* Close all windows */
  204.  
  205. void pascal close_all() {
  206.  
  207.   WINDOW *sav,*wnd=listtail;
  208.  
  209.   while(wnd) {
  210.     sav=PREV;
  211.     delete_window(wnd);
  212.     wnd=sav;
  213.   }
  214. }
  215.  
  216. /* Remove a window */
  217.  
  218. void pascal delete_window (WINDOW *wnd) {
  219.  
  220.   if (verify_wnd(&wnd)) {
  221.     hide_window(wnd);
  222.     free(SAV);
  223.     remove_list(wnd); /* remove window from list */
  224.     free(wnd);
  225.   }
  226. }
  227.  
  228. /* Hide a window */
  229.  
  230. void pascal hide_window (WINDOW *wnd) {
  231.  
  232.   if (verify_wnd(&wnd) && VISIBLE) {
  233. #ifndef FASTWINDOWS
  234.     vswap(wnd);
  235. #else
  236.     vrstr(wnd);
  237. #endif
  238.     HIDDEN=1;
  239.     VISIBLE=0;
  240.   }
  241. }
  242.  
  243. #ifndef FASTWINDOWS
  244.  
  245. /* Reposition the window in its 3-axis plane */
  246.  
  247. void pascal repos_wnd(WINDOW *wnd,int x,int y,int z) {
  248.  
  249.   WINDOW *twnd;
  250.   int x1,y1,chat;
  251.   if (!verify_wnd(&wnd))
  252.     return;
  253.   twnd=establish_window(x+COL,y+ROW,HEIGHT,WIDTH);
  254.   twnd->_tl=WTITLE;
  255.   twnd->btype=BTYPE;
  256.   twnd->wcolor[BORDER]=WBORDER;
  257.   twnd->wcolor[TITLE]=WTITLEC;
  258.   twnd->wcolor[ACCENT]=WACCENT;
  259.   twnd->wcolor[NORMAL]=WNORMAL;
  260.   twnd->_wsp=SCROLL;
  261.   twnd->_cr=WCURS;
  262.   if (z!=1) {
  263.     remove_list(twnd);
  264.     if (z==0)
  265.       insert_list(twnd,wnd);
  266.     else
  267.       beg_list(twnd);
  268.   }
  269.   for(y1=0;y1<twnd->_wh;y1++)
  270.     for (x1=0;x1<twnd->_ww;x1++) {
  271.       chat = dget(wnd,x1,y1);
  272.       displ(twnd,x1,y1,chat&255,(chat>>8)&255);
  273.     }
  274.   twnd->_wv=1;
  275.   vswap(twnd);
  276.   hide_window(wnd);
  277.   free(SAV);
  278.   remove_list(wnd);
  279.   *wnd=*twnd;
  280.   insert_list(wnd,twnd);
  281.   remove_list(twnd);
  282.   free(twnd);
  283. }
  284. #endif
  285.  
  286. /* Clear window */
  287.  
  288. void pascal clear_window (WINDOW *wnd) {
  289.  
  290.   register int x1,y1;
  291.  
  292.   if (verify_wnd(&wnd))
  293.     for(y1=1;y1<HEIGHT-1;y1++)
  294.       for(x1=1;x1<WIDTH-1;x1++)
  295.     displ(wnd,x1,y1,' ',WNORMAL);
  296. }
  297.  
  298. /* Draw the window frame */
  299.  
  300. void pascal wframe (WINDOW *wnd) {
  301.  
  302.   register int x1,y1;
  303.  
  304.   if (!verify_wnd(&wnd)) return;
  305.   /* Window title */
  306.   displ(wnd,0,0,NW,WBORDER);
  307.   dtitle(wnd);
  308.   displ(wnd,WIDTH-1,0,NE,WBORDER);
  309.   /* Window sides */
  310.   for (y1=1;y1<HEIGHT-1;y1++) {
  311.     displ(wnd,0,y1,SIDE,WBORDER);
  312.     displ(wnd,WIDTH-1,y1,SIDE,WBORDER);
  313.   }
  314.   /* Bottom of frame */
  315.   displ(wnd,0,y1,SW,WBORDER);
  316.   for(x1=1;x1<WIDTH-1;x1++)
  317.     displ(wnd,x1,y1,LINE,WBORDER);
  318.   displ(wnd,x1,y1,SE,WBORDER);
  319. }
  320.  
  321.  
  322. static void pascal dtitle (WINDOW *wnd) {
  323.  
  324.   int x1=1,i,ln;
  325.   char *s=WTITLE;
  326.  
  327.   if (!verify_wnd(&wnd)) return;
  328.   if (s) {
  329.     ln=strlen(s);
  330.     if (ln>WIDTH-2)
  331.       i=0;
  332.     else
  333.       i=((WIDTH-2-ln)/2);
  334.     if (i>0)
  335.       while (i--)
  336.     displ(wnd,x1++,0,LINE,WBORDER);
  337.     while(*s && x1<WIDTH-1)
  338.       displ(wnd,x1++,0,*s++,WTITLEC);
  339.   }
  340.   while(x1<WIDTH-1)
  341.     displ(wnd,x1++,0,LINE,WBORDER);
  342. }
  343.  
  344. /* Window-oriented printf */
  345.  
  346. void cdecl wprintf (WINDOW *wnd,char *ln,...) {
  347.  
  348.   char dlin[100],*dl=dlin;
  349.  
  350.   if (verify_wnd(&wnd)) {
  351.     va_list ap;
  352.     va_start(ap,ln);
  353.     vsprintf(dlin,ln,ap);
  354.     va_end(ap);
  355.     while(*dl)
  356.       wputchar(wnd,*dl++);
  357.   }
  358. }
  359.  
  360.  
  361. /* Window-oriented 'raw' printf */
  362.  
  363. void cdecl wprintfraw (WINDOW *wnd,char *ln,...) {
  364.  
  365.   char dlin[100],*dl=dlin;
  366.  
  367.   if (verify_wnd(&wnd)) {
  368.     va_list ap;
  369.     va_start(ap,ln);
  370.     vsprintf(dlin,ln,ap);
  371.     va_end(ap);
  372.     while(*dl)
  373.       wputchar(wnd,*dl++);
  374.   }
  375. }
  376.  
  377. /* Write a character to the window */
  378.  
  379. void pascal wputchar (WINDOW *wnd,int c) {
  380.  
  381.   if (!verify_wnd(&wnd)) return;
  382.   switch(c) {
  383.     case '\n':
  384.       if (SCROLL==HEIGHT-3)
  385.     scroll(wnd,UP);
  386.       else
  387.     SCROLL++;
  388.       WCURS=0;
  389.       break;
  390.     case '\t':
  391.       do displ(wnd,(WCURS++)+3,SCROLL+1,' ',WNORMAL);
  392.     while ((WCURS%TABS) && (WCURS+1)<WIDTH-1